package com.zcc.config;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

//开启WebSecurity模式
@EnableWebSecurity
//需要继承类WebSecurityConfigurerAdapter
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //链式编程
    //授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页都可以访问，功能页需要对应的权限
        //准确来说这一行是设置所有可访问的地址，无需要求，首页不设置也可以
        http.authorizeRequests().antMatchers("/","/index").permitAll()
                //设置权限，vip1用户可以访问level1页面，以此类推
                                .antMatchers("/level1/**").hasRole("vip1")
                                .antMatchers("/level2/**").hasRole("vip2")
                                .antMatchers("/level3/**").hasRole("vip3");
        //没有权限自动跳转到登录页
        //配置自定义的登录页请求
        http.formLogin().loginPage("/toLogin")
                //登录页面传递的用户名密码的参数名，和网页传输的参数名保持一致
                .usernameParameter("ugh")
                .passwordParameter("upwd")
                //登录连接的地址，也就是post发送的地址
                .loginProcessingUrl("/login");
        //防止网站攻击，get不安全
        //所以关闭csrf功能，防止跨站请求伪造可能会阻止一些自身功能，比如注销
        http.csrf().disable();
        //开启注销，注销后返回主页
        http.logout().logoutSuccessUrl("/");
        //开启记住我，默认保存两周，参数为前端传递的参数名，可以自定义，比如rmb_user
        http.rememberMe().rememberMeParameter("remember");
    }

    //认证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //按照用户名密码给用户认证，也就是赋予角色权限，比如vip1，vip2等
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("zcc").password(new BCryptPasswordEncoder().encode("111")).roles("vip1", "vip2", "vip3")
                .and()
                .withUser("zww").password(new BCryptPasswordEncoder().encode("222")).roles("vip1")
                .and()
                .withUser("zhf").password(new BCryptPasswordEncoder().encode("333")).roles("vip2");
    }
}
